using System;
using System.Collections.Generic;
using System.Text;
using Marlimer.Common;
using Marlimer.Common.Entidades;
using System.Data;
using System.Data.SqlClient;

namespace Marlimer.Data.Comercial
{
    public class com_NotaCreditoCab
    {

        public resulOMsgError guardarDocumento(InfoNotaCreditoCab notacab)
        {
            resulOMsgError resul = new resulOMsgError(false, "", null);
            SqlCommand sqlcmd = new SqlCommand();
            Int64 cnewcod_doc = new Int64();

            //creamos la transaccion
            SqlTransaction transac = Session.getConexion().BeginTransaction("savedoc");

            try
            {
                sqlcmd.CommandText = "spiaNotaCreditoCab";
                sqlcmd.CommandType = CommandType.StoredProcedure;
                sqlcmd.Connection = Session.getConexion();
                sqlcmd.Transaction = transac;

                sqlcmd.Parameters.Add("@ccod_doc", SqlDbType.BigInt);
                sqlcmd.Parameters.Add("@ccod_cia", SqlDbType.Int);
                sqlcmd.Parameters.Add("@ctip_docvta", SqlDbType.Int);
                sqlcmd.Parameters.Add("@cnum_serie", SqlDbType.Int);
                sqlcmd.Parameters.Add("@cnum_docvta", SqlDbType.BigInt);
                sqlcmd.Parameters.Add("@dfec_emi", SqlDbType.DateTime);
                sqlcmd.Parameters.Add("@ccod_cli", SqlDbType.Int);
                sqlcmd.Parameters.Add("@ccod_modulo", SqlDbType.NVarChar, 15);
                sqlcmd.Parameters.Add("@ccod_ruta", SqlDbType.Int);
                sqlcmd.Parameters.Add("@ccod_vend", SqlDbType.Int);
                sqlcmd.Parameters.Add("@ccod_mone", SqlDbType.Int);
                sqlcmd.Parameters.Add("@nval_mone", SqlDbType.Decimal);
                sqlcmd.Parameters.Add("@ccod_docvta", SqlDbType.BigInt);
                sqlcmd.Parameters.Add("@ntot_bruto", SqlDbType.Decimal);
                sqlcmd.Parameters.Add("@ntot_dcto", SqlDbType.Decimal);
                sqlcmd.Parameters.Add("@npor_igv", SqlDbType.Decimal);
                sqlcmd.Parameters.Add("@cobservacion", SqlDbType.NVarChar, 50);
                sqlcmd.Parameters.Add("@cpc_crea", SqlDbType.NVarChar, 50);
                sqlcmd.Parameters.Add("@cuser_crea", SqlDbType.Int);
                sqlcmd.Parameters.Add("@cmodo", SqlDbType.Int);

                sqlcmd.Parameters["@ccod_doc"].Value = notacab.ccod_doc;
                sqlcmd.Parameters["@ccod_cia"].Value = notacab.ccod_cia;
                sqlcmd.Parameters["@ctip_docvta"].Value = notacab.ctip_docvta;
                sqlcmd.Parameters["@cnum_serie"].Value = notacab.cnum_serie;
                sqlcmd.Parameters["@cnum_docvta"].Value = notacab.cnum_docvta;
                sqlcmd.Parameters["@dfec_emi"].Value = notacab.dfec_emi;
                sqlcmd.Parameters["@ccod_cli"].Value = notacab.ccod_cli;
                sqlcmd.Parameters["@ccod_modulo"].Value = notacab.ccod_modulo;
                sqlcmd.Parameters["@ccod_ruta"].Value = notacab.ccod_ruta;
                sqlcmd.Parameters["@ccod_vend"].Value = notacab.ccod_vend;
                sqlcmd.Parameters["@ccod_mone"].Value = notacab.ccod_mone;
                sqlcmd.Parameters["@nval_mone"].Value = notacab.nval_mone;
                sqlcmd.Parameters["@ccod_docvta"].Value = notacab.ccod_docvta;
                sqlcmd.Parameters["@ntot_bruto"].Value = notacab.ntot_bruto;
                sqlcmd.Parameters["@ntot_dcto"].Value = notacab.ntot_dcto;
                sqlcmd.Parameters["@npor_igv"].Value = notacab.npor_igv;
                sqlcmd.Parameters["@cobservacion"].Value = notacab.cobservacion;
                sqlcmd.Parameters["@cpc_crea"].Value = notacab.cpc_crea;
                sqlcmd.Parameters["@cuser_crea"].Value = notacab.cuser_crea;
                sqlcmd.Parameters["@cmodo"].Value = notacab.cmodo;

                long ccod_doc = 0;
                if (notacab.cmodo == 1)
                {//insertar
                    ccod_doc = Convert.ToInt64(sqlcmd.ExecuteScalar());
                }
                else
                {//actualizar
                    ccod_doc = notacab.ccod_doc;
                    sqlcmd.ExecuteNonQuery();
                }

                
                //insertar los detalles de la nota de credito
                //aqui se insertan los detalles de guia de almacen para la nota de credito
                //indicada
                sqlcmd.CommandText = "spiNotaCreditoDet";
                sqlcmd.Transaction = transac;
                sqlcmd.Parameters.Clear();

                sqlcmd.Parameters.Add("@ccod_doc", SqlDbType.BigInt);
                sqlcmd.Parameters.Add("@ccod_prod", SqlDbType.Int);
                sqlcmd.Parameters.Add("@ncant", SqlDbType.Int);
                sqlcmd.Parameters.Add("@npre_vta", SqlDbType.Decimal);
                sqlcmd.Parameters.Add("@npor_dcto", SqlDbType.Decimal);
                sqlcmd.Parameters.Add("@ccod_unimed", SqlDbType.Int);

                foreach (InfoNotaCreditoDet docdet in notacab.detalledoc)
                {
                    sqlcmd.Parameters["@ccod_doc"].Value = ccod_doc;
                    sqlcmd.Parameters["@ccod_prod"].Value = docdet.ccod_prod;
                    sqlcmd.Parameters["@ncant"].Value = docdet.ncant;
                    sqlcmd.Parameters["@npre_vta"].Value = docdet.npre_vta;
                    sqlcmd.Parameters["@npor_dcto"].Value = docdet.npor_dcto;
                    sqlcmd.Parameters["@ccod_unimed"].Value = docdet.ccod_unimed;
                    sqlcmd.ExecuteNonQuery();
                }

                //terminamos la transaccion
                transac.Commit();

                resul.message = "Se guardo el documento satisfactoriamente.";
                cnewcod_doc = (Int64)ccod_doc;
                resul.clase = cnewcod_doc;
                resul.resul = true;
            }
            catch (Exception ex)
            {
                transac.Rollback();
                resul.message = ex.Message;
            }

            return resul;
        }



        public resulOMsgError guardarDocumento(InfoNotaCreditoCab notacab, InfoDocumentoCab doc)
        {
            resulOMsgError resul = new resulOMsgError(false, "", null);
            SqlCommand sqlcmd = new SqlCommand();
            Int64 cnewcod_doc = new Int64();

            //creamos la transaccion
            SqlTransaction transac = Session.getConexion().BeginTransaction("savedoc");

            try
            {
                sqlcmd.CommandText = "spiaNotaCreditoCab";
                sqlcmd.CommandType = CommandType.StoredProcedure;
                sqlcmd.Connection = Session.getConexion();
                sqlcmd.Transaction = transac;

                sqlcmd.Parameters.Add("@ccod_doc", SqlDbType.BigInt);
                sqlcmd.Parameters.Add("@ccod_cia", SqlDbType.Int);
                sqlcmd.Parameters.Add("@ctip_docvta", SqlDbType.Int);
                sqlcmd.Parameters.Add("@cnum_serie", SqlDbType.Int);
                sqlcmd.Parameters.Add("@cnum_docvta", SqlDbType.BigInt);
                sqlcmd.Parameters.Add("@dfec_emi", SqlDbType.DateTime);
                sqlcmd.Parameters.Add("@ccod_cli", SqlDbType.Int);
                sqlcmd.Parameters.Add("@ccod_modulo", SqlDbType.NVarChar, 15);
                sqlcmd.Parameters.Add("@ccod_ruta", SqlDbType.Int);
                sqlcmd.Parameters.Add("@ccod_vend", SqlDbType.Int);
                sqlcmd.Parameters.Add("@ccod_mone", SqlDbType.Int);
                sqlcmd.Parameters.Add("@nval_mone", SqlDbType.Decimal);
                sqlcmd.Parameters.Add("@ccod_docvta", SqlDbType.BigInt);
                sqlcmd.Parameters.Add("@ntot_bruto", SqlDbType.Decimal);
                sqlcmd.Parameters.Add("@ntot_noafec", SqlDbType.Decimal);
                sqlcmd.Parameters.Add("@ntot_dcto", SqlDbType.Decimal);
                sqlcmd.Parameters.Add("@ntot_dctonoafec", SqlDbType.Decimal);
                sqlcmd.Parameters.Add("@npor_igv", SqlDbType.Decimal);
                sqlcmd.Parameters.Add("@cobservacion", SqlDbType.NVarChar, 50);
                sqlcmd.Parameters.Add("@cpc_crea", SqlDbType.NVarChar, 50);
                sqlcmd.Parameters.Add("@cuser_crea", SqlDbType.Int);
                sqlcmd.Parameters.Add("@cmodo", SqlDbType.Int);

                sqlcmd.Parameters["@ccod_doc"].Value = notacab.ccod_doc;
                sqlcmd.Parameters["@ccod_cia"].Value = notacab.ccod_cia;
                sqlcmd.Parameters["@ctip_docvta"].Value = notacab.ctip_docvta;
                sqlcmd.Parameters["@cnum_serie"].Value = notacab.cnum_serie;
                sqlcmd.Parameters["@cnum_docvta"].Value = notacab.cnum_docvta;
                sqlcmd.Parameters["@dfec_emi"].Value = notacab.dfec_emi;
                sqlcmd.Parameters["@ccod_cli"].Value = notacab.ccod_cli;
                sqlcmd.Parameters["@ccod_modulo"].Value = notacab.ccod_modulo;
                sqlcmd.Parameters["@ccod_ruta"].Value = notacab.ccod_ruta;
                sqlcmd.Parameters["@ccod_vend"].Value = notacab.ccod_vend;
                sqlcmd.Parameters["@ccod_mone"].Value = notacab.ccod_mone;
                sqlcmd.Parameters["@nval_mone"].Value = notacab.nval_mone;
                sqlcmd.Parameters["@ccod_docvta"].Value = notacab.ccod_docvta;
                sqlcmd.Parameters["@ntot_bruto"].Value = notacab.ntot_bruto;
                sqlcmd.Parameters["@ntot_noafec"].Value = notacab.ntot_noafec;
                sqlcmd.Parameters["@ntot_dcto"].Value = notacab.ntot_dcto;
                sqlcmd.Parameters["@ntot_dctonoafec"].Value = notacab.ntot_dctonoafec;
                sqlcmd.Parameters["@npor_igv"].Value = notacab.npor_igv;
                sqlcmd.Parameters["@cobservacion"].Value = notacab.cobservacion;
                sqlcmd.Parameters["@cpc_crea"].Value = notacab.cpc_crea;
                sqlcmd.Parameters["@cuser_crea"].Value = notacab.cuser_crea;
                sqlcmd.Parameters["@cmodo"].Value = notacab.cmodo;

                long ccod_doc = 0;
                if (notacab.cmodo == 1)
                {//insertar
                    ccod_doc = Convert.ToInt64(sqlcmd.ExecuteScalar());
                }
                else
                {//actualizar
                    ccod_doc = notacab.ccod_doc;
                    sqlcmd.ExecuteNonQuery();
                }

                //anular el documento por parcializacion
                //actualizamos el documento su encabezado
                //esto eliminara los detalles de guia de almacen para
                //la nota de credito indicada
                sqlcmd.CommandText = "spuAnularDocumentoParcial";
                sqlcmd.Transaction = transac;
                sqlcmd.Parameters.Clear();

                sqlcmd.Parameters.Add("@ccod_doc", SqlDbType.BigInt);
                sqlcmd.Parameters.Add("@ccod_docnc", SqlDbType.BigInt);
                sqlcmd.Parameters.Add("@cpc_crea", SqlDbType.NVarChar, 50);
                sqlcmd.Parameters.Add("@cuser_crea", SqlDbType.Int);

                sqlcmd.Parameters["@ccod_doc"].Value = doc.ccod_doc;
                sqlcmd.Parameters["@ccod_docnc"].Value = ccod_doc;
                sqlcmd.Parameters["@cpc_crea"].Value = Session.getComputerName();
                sqlcmd.Parameters["@cuser_crea"].Value = Session.getInfousuario().ccod_user;

                sqlcmd.ExecuteNonQuery(); 

                //insertar los detalles de la nota de credito
                //aqui se insertan los detalles de guia de almacen para la nota de credito
                //indicada
                sqlcmd.CommandText = "spiNotaCreditoDet";
                sqlcmd.Transaction = transac;
                sqlcmd.Parameters.Clear();

                sqlcmd.Parameters.Add("@ccod_doc", SqlDbType.BigInt);
                sqlcmd.Parameters.Add("@ccod_prod", SqlDbType.Int);
                sqlcmd.Parameters.Add("@ncant", SqlDbType.Int);
                sqlcmd.Parameters.Add("@npre_vta", SqlDbType.Decimal);
                sqlcmd.Parameters.Add("@npor_dcto", SqlDbType.Decimal);
                sqlcmd.Parameters.Add("@ccod_unimed", SqlDbType.Int);
                sqlcmd.Parameters.Add("@flg_noafecigv", SqlDbType.Int);
                sqlcmd.Parameters.Add("@npor_igv", SqlDbType.Decimal);    

                foreach (InfoNotaCreditoDet docdet in notacab.detalledoc)
                {
                    sqlcmd.Parameters["@ccod_doc"].Value = ccod_doc;
                    sqlcmd.Parameters["@ccod_prod"].Value = docdet.ccod_prod;
                    sqlcmd.Parameters["@ncant"].Value = docdet.ncant;
                    sqlcmd.Parameters["@npre_vta"].Value = docdet.npre_vta;
                    sqlcmd.Parameters["@npor_dcto"].Value = docdet.npor_dcto;
                    sqlcmd.Parameters["@ccod_unimed"].Value = docdet.ccod_unimed;
                    sqlcmd.Parameters["@flg_noafecigv"].Value = docdet.flg_noafecigv;
                    sqlcmd.Parameters["@npor_igv"].Value = docdet.npor_igvdet();
                    sqlcmd.ExecuteNonQuery();
                }



                //actualizamos el documento de venta sus detalles

                sqlcmd.CommandText = "spiDocumentoDet";
                sqlcmd.Transaction = transac;
                sqlcmd.Parameters.Clear();

                sqlcmd.Parameters.Add("@ccod_doc", SqlDbType.BigInt);
                sqlcmd.Parameters.Add("@ccod_prod", SqlDbType.Int);
                sqlcmd.Parameters.Add("@ncant", SqlDbType.Int);
                sqlcmd.Parameters.Add("@ccod_unimed", SqlDbType.Int);
                sqlcmd.Parameters.Add("@npre_vta", SqlDbType.Decimal);
                sqlcmd.Parameters.Add("@npor_dcto", SqlDbType.Decimal);
                sqlcmd.Parameters.Add("@flg_devolucion", SqlDbType.Int);
                sqlcmd.Parameters.Add("@flg_noafecigv", SqlDbType.Int);
                sqlcmd.Parameters.Add("@npor_igv", SqlDbType.Decimal);

                foreach (InfoDocumentoDet docdet in doc.documentoDet)
                {
                    sqlcmd.Parameters["@ccod_doc"].Value = doc.ccod_doc;
                    sqlcmd.Parameters["@ccod_prod"].Value = docdet.ccod_prod;
                    sqlcmd.Parameters["@ncant"].Value = docdet.ncant;
                    sqlcmd.Parameters["@ccod_unimed"].Value = docdet.ccod_unimed;
                    sqlcmd.Parameters["@npre_vta"].Value = docdet.npre_vta;
                    sqlcmd.Parameters["@npor_dcto"].Value = docdet.npor_dcto;
                    sqlcmd.Parameters["@flg_devolucion"].Value = docdet.flg_devolucion;
                    sqlcmd.Parameters["@flg_noafecigv"].Value = docdet.flg_noafecigv;
                    sqlcmd.Parameters["@npor_igv"].Value = docdet.npor_igvdet();
                    sqlcmd.ExecuteNonQuery();
                }

                //terminamos la transaccion
                transac.Commit();

                resul.message = "Se guardo el documento satisfactoriamente.";
                cnewcod_doc = (Int64)ccod_doc;
                resul.clase = cnewcod_doc;
                resul.resul = true;
            }
            catch (Exception ex)
            {
                transac.Rollback();
                resul.message = ex.Message;
            }

            return resul;
        }

        public DataTable NotaCreditoCabByCod(long ccod_doc)
        {
            SqlCommand sqlcmd = new SqlCommand();
            SqlDataAdapter da = new SqlDataAdapter();
            DataSet ds = new DataSet();

            sqlcmd.CommandText = "spsNotaCreditoCabByCod";
            sqlcmd.CommandType = CommandType.StoredProcedure;
            sqlcmd.Connection = Session.getConexion();

            sqlcmd.Parameters.Add("@ccod_doc", SqlDbType.BigInt);

            sqlcmd.Parameters["@ccod_doc"].Value = ccod_doc;

            da.SelectCommand = sqlcmd;
            da.Fill(ds);

            return ds.Tables[0];
        }

        public DataTable NotaCreditoDetByCod(long ccod_doc)
        {
            SqlCommand sqlcmd = new SqlCommand();
            SqlDataAdapter da = new SqlDataAdapter();
            DataSet ds = new DataSet();

            sqlcmd.CommandText = "spsNotaCreditoDetByCod";
            sqlcmd.CommandType = CommandType.StoredProcedure;
            sqlcmd.Connection = Session.getConexion();

            sqlcmd.Parameters.Add("@ccod_doc", SqlDbType.BigInt);

            sqlcmd.Parameters["@ccod_doc"].Value = ccod_doc;

            da.SelectCommand = sqlcmd;
            da.Fill(ds);

            return ds.Tables[0];
        }




        public DataTable consultaDocumento(DateTime dfec_ini, DateTime dfec_fin, int cnum_serie, long cnum_desde, long cnum_hasta, int ccod_ruta, string ccod_modulo, int ccod_cli, int flg_anulados, int ctip_bus)
        {
            SqlCommand sqlcmd = new SqlCommand();
            SqlDataAdapter da = new SqlDataAdapter();
            DataSet ds = new DataSet();

            sqlcmd.CommandText = "spsConsultarNotasCredito";
            sqlcmd.CommandType = CommandType.StoredProcedure;
            sqlcmd.Connection = Session.getConexion();

            sqlcmd.Parameters.Add("@dfec_ini", SqlDbType.DateTime);
            sqlcmd.Parameters.Add("@dfec_fin", SqlDbType.DateTime);
            sqlcmd.Parameters.Add("@cnum_serie", SqlDbType.Int);
            sqlcmd.Parameters.Add("@cnum_desde", SqlDbType.BigInt);
            sqlcmd.Parameters.Add("@cnum_hasta", SqlDbType.BigInt);
            sqlcmd.Parameters.Add("@ccod_ruta", SqlDbType.Int);
            sqlcmd.Parameters.Add("@ccod_modulo", SqlDbType.NVarChar, 15);
            sqlcmd.Parameters.Add("@ccod_cli", SqlDbType.Int);
            sqlcmd.Parameters.Add("@flg_anulados", SqlDbType.Int);
            sqlcmd.Parameters.Add("@ctip_bus", SqlDbType.Int);

            sqlcmd.Parameters["@dfec_ini"].Value = dfec_ini;
            sqlcmd.Parameters["@dfec_fin"].Value = dfec_fin;
            sqlcmd.Parameters["@cnum_serie"].Value = cnum_serie;
            sqlcmd.Parameters["@cnum_desde"].Value = cnum_desde;
            sqlcmd.Parameters["@cnum_hasta"].Value = cnum_hasta;
            sqlcmd.Parameters["@ccod_ruta"].Value = ccod_ruta;
            sqlcmd.Parameters["@ccod_modulo"].Value = ccod_modulo;
            sqlcmd.Parameters["@ccod_cli"].Value = ccod_cli;
            sqlcmd.Parameters["@flg_anulados"].Value = flg_anulados;
            sqlcmd.Parameters["@ctip_bus"].Value = ctip_bus;

            da.SelectCommand = sqlcmd;
            da.Fill(ds);

            return ds.Tables[0];
        }
    }
}
